package com.infinitescrolling.server.model;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadLocalRandom;
public class DudeGenerator {
final String firstLetter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final String numsAndLetters = "0123456789" + firstLetter.toLowerCase();
final int numThreads = 4;
final CountDownLatch latch = new CountDownLatch(numThreads);
private DudeDao dudeDao = new DudeDao();
public void generateAndSave(int genNum) {
List<Dude> list = new ArrayList<>();
for (int i = 0; i < genNum; i++) {
Dude d = new Dude();
d.setId(i);
d.setFirstName(random5to10Name());
d.setLastName(random5to10Name());
list.add(d);
if (i % 25_000 == 0) {
dudeDao.saveList(list);
list.clear();
}
}
dudeDao.saveList(list);
}
public void parGenerateAndSave(final int genNum) {
for (int i = 0; i < numThreads; i++) {
Runnable run = new Runnable() {
@Override
public void run() {
List<Dude> list = new ArrayList<>();
int number = Integer.parseInt(Thread.currentThread().getName());
System.out.println("Thread: " + number + " (" + (number * genNum/numThreads) + " - " + ((number + 1) * genNum/numThreads) + ")");
for (int j = (number * genNum/numThreads); j < ((number + 1) * genNum/numThreads); j++) {
Dude dude = new Dude();
dude.setId(j);
dude.setFirstName(random5to10Name());
dude.setLastName(random5to10Name());
list.add(dude);
}
dudeDao.saveList(list);
latch.countDown();
}
};
Thread t = new Thread(run);
t.setName(String.valueOf(i));
t.start();
}
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public String start(int genNum) {
long start = System.currentTimeMillis();
dudeDao.clearTable();
dudeDao.prepare();
dudeDao.createSchema();
parGenerateAndSave(genNum);
long end = System.currentTimeMillis();
return ("Generation time: " + ((double) (end - start)/1000) + " s");
}
public String random5to10Name() {
int randLength = 5 + ThreadLocalRandom.current().nextInt(6);
StringBuilder sb = new StringBuilder(randLength);
sb.append(firstLetter.charAt(ThreadLocalRandom.current().nextInt(firstLetter.length())));
for(int i = 0; i < randLength - 1; i++)
sb.append(numsAndLetters.charAt(ThreadLocalRandom.current().nextInt(numsAndLetters.length())));
return sb.toString();
}
}